// getUser(params).then(res=>{结果})

/**
 *
 * @param promiseReduce : 请求的接口函数
 * @param params : 请求的参数
 * @param interval : 间隔多久请求一次
 * @param attemptTimes  : 请求的次数
 * @returns {Promise<any>} : 返回的结果
 *
 * example : requestOnce(getUser,{userId:1},1000,10).then(res=>{成功}).catch(e=>{失败})
 *
 *
 */
export function requestOnce(promiseReduce, params, interval, attemptTimes) {
  //1. 验证参数
  // <300 不行 设置成 500
  interval = typeof interval === 'number' && interval >= 300 ? interval : 500;
  attemptTimes = typeof attemptTimes === 'number' && attemptTimes >= 1 ? attemptTimes : 100;
  let times = attemptTimes;
  //2. 什么时候成功  什么时候失败
  return new Promise((resolve, reject) => {
    let executeTask = () => {
      if (times <= 1) {
        window.clearInterval(timer); // 完全失败
        reject(new Error('request fail until times out'));
      }
      // 次数减一
      times -= 1;
      // 处理请求
      return promiseReduce(params).then(res => {
        window.clearInterval(timer); // 完全成功
        console.log('成功');
        resolve(res);
      }).catch(e => {
        // 这次失败了
        throw new Error('request fail');
      })
    };
    let timer = setInterval(() => {
      // 间隔interval之后请求一次
      executeTask()
    }, interval);
    // 第一次进来的时候 请求一次
    executeTask()
  });
}
